package Logikk;

import Beans.Deltaker;
import Beans.Klasse;
import Beans.Lop;
import Beans.Resultat;
import DB.DBehandler;
import java.io.Serializable;
import java.util.ArrayList;

/**
 * Klasse som inneholder alle resultat
 * @author Gruppe1
 */
public class AlleResultat implements Serializable{

    private DBehandler db = new DBehandler();
    ArrayList<Resultat> resultat = new ArrayList<Resultat>();
    Lop def = new Lop(0, "", null, 0.0, "");
    private boolean tid = true;
    private boolean rekkefolge = false;

    /**
     * Metode som henter et tomt løp
     * @return et tomt løp
     */
    public Lop getDef() {
        return def;
    }

    /**
     * Metode som setter ett løp
     * @param def
     */
    public void setDef(Lop def) {
        this.def = def;
    }

    /**
     * Metode som henter alle resultat 
     * @return en arrayList med resultat
     */
    public ArrayList<Resultat> getResultat() {
        return resultat;
    }
    
    /**
     * Metode som sorter resultat etter klasse, setter tid lik true, og rekkefølge lik !rekkefølge
     * @param lop_id
     */
    public void sorterEtterKlasse(int lop_id) {
        tid = true;
        rekkefolge = !rekkefolge;
    }

    /**
     * Metode som sorterer resultat etter tid, setter tid lik false og rekkefølge lik !rekkefølge
     * @param lop_id
     */
    public void sorterEtterTid(int lop_id) {
        tid = false;
        rekkefolge = !rekkefolge;
    }

    /**
     * Metode som henter ut alle resultat
     * @return en arrayList med alleresultatene
     */
    public ArrayList<Resultat> hentResultat() {
        ArrayList<Resultat> res = new ArrayList<Resultat>();
        
        for (Resultat r : resultat) {
            res.add(new Resultat(r.getDelta(), r.getKlasse(), r.getLop(), r.getStartNr(), r.getTid(), r.isEditable()));
        }
        resultat = db.finnResultatLop(def.getLop_id(), tid, rekkefolge);
        for (int i = 0; i < resultat.size(); i++) {
            for (int j = 0; j < res.size(); j++) {
                if (resultat.get(i).equals(res.get(j))) {
                    if(res.get(j).isDeleted()){
                        db.slettResultat(resultat.get(i));
                        resultat.remove(i);
                    }
                    resultat.get(i).setEditable(res.get(j).isEditable());
                }
            }
        }
        
        return resultat;
    }

    /**
     * Metode som lagrer resultat
     * @return null
     */
    public String save() {
        for (Resultat r : resultat) {
            r.setEditable(false);
            db.registrerResultat(r.getStartNr(), r.getLop().getLop_id(), r.getTid());
        }
        return null;
    }

    /**
     * Metode som legger til et resultat
     * @param r
     * @param start_nr
     * @param lop_id
     * @return returnerer false hvis feil, true hvis det gikk bra
     */
    public boolean leggTilResultat(Resultat r, int start_nr, int lop_id) {
        if (resultat == null || r == null) {
            return false;
        }
        for (Resultat res : resultat) {
            if (res.equals(r)) {
                return false;
            }
        }
        
        Resultat resultatet = finnResultat(start_nr, lop_id);
        
        if (resultatet == null) {
            return false;
        }
        resultatet.setTid(r.getTid());
        return true;
    }

    /**
     * Metode som legger til en deltaker
     * @param d
     * @param l
     * @param k
     * @param nr
     * @return true hvis man legger til et resultat, false hvis ikke
     */
    public boolean leggTilDeltaker(Deltaker d, Lop l, Klasse k, int nr) {
        for (Resultat res : resultat) {
            if (res.equals(new Resultat(d, k, l, nr))) {
                return false;
            }
        }
        resultat.add(new Resultat(d, k, l));
        return true;
    }

    /**
     * Metode som finner resultat og returnerer dette
     * @param start_nr
     * @param lop_id
     * @return et resultat med start_nr og løp_id
     */
    public Resultat finnResultat(int start_nr, int lop_id) {
        return db.hentResultat(start_nr, lop_id);
    }
}
